package cn.csc.module.product.dal.mysql.spu;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.mybatis.core.mapper.BaseMapperX;
import cn.csc.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.csc.framework.mybatis.core.query.LambdaUpdateWrapperX;
import cn.csc.framework.mybatis.core.query.QueryWrapperX;
import cn.csc.module.product.api.spu.dto.SpuDTO;
import cn.csc.module.product.controller.admin.spu.vo.*;
import cn.csc.module.product.controller.app.spu.vo.AppSpuCreateReqVO;
import cn.csc.module.product.controller.app.spu.vo.AppSpuRespVO;
import cn.csc.module.product.controller.app.spu.vo.AppSpuSearchPageReqVO;
import cn.csc.module.product.dal.dataobject.spu.SpuDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigInteger;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * spu信息 Mapper
 *
 * @author liuchuang
 */
@Mapper
public interface SpuMapper extends BaseMapperX<SpuDO> {

    default PageResult<SpuDO> selectPage(SpuPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getShopName, reqVO.getShopName())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getPhone, reqVO.getPhone())
                .eqIfPresent(SpuDO::getHasShop, reqVO.getHasShop())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .inIfPresent(SpuDO::getVerifyStatus,reqVO.getStatusList())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getId));
    }

    default PageResult<SpuDO> selectPageV2(SpuPageReqV2VO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getShopName, reqVO.getShopName())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getPhone, reqVO.getPhone())
                .eqIfPresent(SpuDO::getHasShop, reqVO.getHasShop())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .inIfPresent(SpuDO::getVerifyStatus,reqVO.getStatusList())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getId));
    }

    default PageResult<SpuDO> selectPageByOnLineTimeDesc(SpuPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getShopName, reqVO.getShopName())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getPhone, reqVO.getPhone())
                .eqIfPresent(SpuDO::getHasShop, reqVO.getHasShop())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .inIfPresent(SpuDO::getVerifyStatus,reqVO.getStatusList())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getOnlineTime));
    }

    default PageResult<SpuDO> selectPageByOnLineTimeV2Desc(SpuPageReqV2VO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getShopName, reqVO.getShopName())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getPhone, reqVO.getPhone())
                .eqIfPresent(SpuDO::getHasShop, reqVO.getHasShop())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .inIfPresent(SpuDO::getVerifyStatus,reqVO.getStatusList())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getOnlineTime));
    }

    default PageResult<SpuDO> selectPageSingle(SpuPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .inIfPresent(SpuDO::getCategoryId,reqVO.getCategoryList())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getShopName, reqVO.getShopName())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getPhone, reqVO.getPhone())
                .eqIfPresent(SpuDO::getHasShop, reqVO.getHasShop())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SpuDO::getVerifyStatus, reqVO.getVerifyStatus())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getId));
    }

    default PageResult<SpuDO> selectPageSingleV2(SpuPageReqV2VO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .inIfPresent(SpuDO::getCategoryId,reqVO.getCategoryList())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getShopName, reqVO.getShopName())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getPhone, reqVO.getPhone())
                .eqIfPresent(SpuDO::getHasShop, reqVO.getHasShop())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SpuDO::getVerifyStatus, reqVO.getVerifyStatus())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getVerifyTime));
    }

    default PageResult<SpuDO> selecShopProductListV2(SpuPageReqV2VO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getShopName, reqVO.getShopName())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getPhone, reqVO.getPhone())
                .eqIfPresent(SpuDO::getHasShop, reqVO.getHasShop())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SpuDO::getVerifyStatus, reqVO.getVerifyStatus())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getId));
    }

    default List<SpuDO> selectList(SpuExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SpuDO::getVerifyStatus, reqVO.getVerifyStatus())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getId));
    }

    default List<SpuDO> selectListByIds(Collection<BigInteger> list) {
        return selectList(new LambdaQueryWrapperX<SpuDO>()
                .in(SpuDO::getId, list));
    }

    default List<SpuDO> selectListV2(SpuExportReqV2VO reqVO) {
        return selectList(new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SpuDO::getVerifyStatus, reqVO.getVerifyStatus())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .orderByDesc(SpuDO::getId));
    }

    default List<SpuDO> selectGroupByList(SpuPageReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<SpuDO>()
                .ifSelect(SpuDO::getCategoryId)
                .eqIfPresent(SpuDO::getBrandId, reqVO.getBrandId())
                .eqIfPresent(SpuDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(SpuDO::getShopCategoryId, reqVO.getShopCategoryId())
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .likeIfPresent(SpuDO::getName, reqVO.getName())
                .eqIfPresent(SpuDO::getSellingPoint, reqVO.getSellingPoint())
                .eqIfPresent(SpuDO::getMainImgUrl, reqVO.getMainImgUrl())
                .eqIfPresent(SpuDO::getImgUrls, reqVO.getImgUrls())
                .eqIfPresent(SpuDO::getVideo, reqVO.getVideo())
                .eqIfPresent(SpuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SpuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SpuDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SpuDO::getVerifyStatus, reqVO.getVerifyStatus())
                .eqIfPresent(SpuDO::getHasSkuImg, reqVO.getHasSkuImg())
                .eqIfPresent(SpuDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(SpuDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(SpuDO::getVerifyTime, reqVO.getVerifyTime())
                .betweenIfPresent(SpuDO::getOnlineTime, reqVO.getOnlineTime())
                .groupBy(SpuDO::getCategoryId));
    }

    default Long selectOKSpuNum(SpuDTO reqVO){
        return selectCount(new LambdaQueryWrapperX<SpuDO>()
                .eqIfPresent(SpuDO::getShopId, reqVO.getShopId())
                .eqIfPresent(SpuDO::getVerifyStatus, reqVO.getVerifyStatus()));
    }


    default List<Map<String,Object>> selectSkuCountByShopIds(Integer verifyStatus, List<BigInteger> list){
        return selectMaps(new QueryWrapperX<SpuDO>()
                .select("shop_id as shopId, count(*) count")
                .eq("verify_status", verifyStatus)
                .in("shop_id", list)
                .groupBy("shop_id")
        );
    }

    default SpuDO getSpu(BigInteger id) {
        return selectOne(new LambdaQueryWrapperX<SpuDO>()
                .eq(SpuDO::getId, id)
                .eq(SpuDO::getVerifyStatus,10));
    }

    default List<SpuDO> selectLastNew(AppSpuCreateReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<SpuDO>().
                eqIfPresent(SpuDO::getVerifyStatus,reqVO.getVerifyStatus())
                .orderByDesc(SpuDO::getVerifyTime).last(reqVO.getLimitNum()));
    }

    /**
     * 多表关联查询分页
     * @param reqVO 请求参数
     * @param page 分页参数
     * @return
     */
    Page<SpuDataRespVO> searchLikeSpuNamePage(@Param("req") AppSpuSearchPageReqVO reqVO, IPage<SpuDataRespVO> page);

    List<AppSpuRespVO> selectHighByCategoryId(BigInteger categoryId);

    Page<AppSpuRespVO> searchAppProduct(@Param("req") AppSpuSearchPageReqVO reqVO, IPage<AppSpuRespVO> page);

    void addFraction(SpuDataRespV2VO spuDataRespV2VO);

    default int updateSaleNumById(@Param("spuId") BigInteger spuId, @Param("count") Integer count){
        LambdaUpdateWrapperX<SpuDO> updateWrapper = new LambdaUpdateWrapperX();
        updateWrapper.increField(SpuDO::getSaleNum,count);
        updateWrapper.eq(SpuDO::getId,spuId);
        return update(null,updateWrapper);
    }


}
